%matplotlib inline
import numpy as np
import cv2
import glob
import matplotlib.pyplot as plt
import pickle
import matplotlib.image as mpimg
import os
from moviepy.editor import VideoFileClip
from IPython.display import display, Markdown, HTML
# https://stackoverflow.com/questions/36013063/what-is-the-purpose-of-meshgrid-in-python-numpy
objp = np.zeros(shape=(6*9, 3), dtype=np.float32) # 2D rows(6*9)*cols(3)
objp[:, :2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2)
print(objp.shape)
print(objp[5])
def camera_calibration(images):
objpoints = [] # 3D Real World
imgpoints = [] # 2D Image Plane
images_cal = []
for idx, file in enumerate(images):
img = cv2.imread(file)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_size = img.shape[1], img.shape[0]
ret, corners = cv2.findChessboardCorners(gray, (9,6))
if ret:
imgpoints.append(corners)
objpoints.append(objp)
cv2.drawChessboardCorners(img, (9,6), corners, ret)
images_cal.append(img)
return objpoints, imgpoints, images_cal, img_size
images = glob.glob('./data/camera_cal/calibration*.jpg')
objpoints, imgpoints, images_cal, img_size = camera_calibration(images)
def plot_images(images, rows, cols, figsize=(12, 6)):
fig, axes = plt.subplots(rows, cols, figsize=figsize)
idx = 0
for r in range(rows):
for c in range(cols):
ax = axes[r, c]
ax.imshow(images[idx])
idx += 1
plt.tight_layout()
plot_images(images_cal, 4, 4, (15, 8))
plt.savefig('./data/output_images/images_calibrated.jpg')
file_pkl = f'./data/calibration_pickle.p'
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, img_size, None, None)
cal_pkl = {'mtx': mtx, 'dist': dist}
with open(file_pkl, 'wb') as fp:
pickle.dump(cal_pkl, fp)
test_images = glob.glob('./data/test_images/*.jpg')
#print(len(test_images))
test_images = [mpimg.imread(img) for img in test_images]
plot_images(test_images, 2, 4, figsize=(12, 3))
plt.savefig('./data/output_images/images_test_original.jpg')
import plotly
import plotly.express as px
fig = px.imshow(test_images[1]) # Select that has lines straight
#print(test_images[1].shape[1], test_images[1].shape[0])
fig.write_image('./data/output_images/image_PerspectiveTransform.jpg')
fig.show()